package com.atbeijing.bigdata.spark.core.rdd.instance

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Spark02_Instance_Disk_Par_Data {

    def main(args: Array[String]): Unit = {

        val conf = new SparkConf().setMaster("local[*]").setAppName("Par")
        val sc = new SparkContext(conf)

        // TODO RDD - 实例化 - 磁盘文件
        // totalsize 所有文件总的字节数 => 7
        // minPartitions : 预期分区数量 => 2
        // goalsize 每个分区应该存放的字节数 7 / 2 = 3

        // totalsize / goalsize = 7 / 3 = 2...1
        // 1 / 3 = 33% > 10% => 1
        // 2 + 1

        // TODO 文件数据如何分区存放？
        // 1. 分区计算和数据存放的规则是两回事，不同。
        //    计算分区时，需要按照字节数进行计算的，但是存放数据不能按照字节数存放
        // 2. Spark分区数据存放是采用Hadoop的处理方式
        //    Hadoop读取数据时不是按照字节读取的，是按行读取的
        //    intersection
        // 3. Hadoop读取数据时，不是按照数据的位置，而是按照数据的偏移量读取的
        //    偏移量是从0开始的。
        // 4. Hadoop读取数据时，偏移量不会重复读取

        /*
           1@@  => 012
           2@@  => 345
           3    => 6

           0 => [0, 3] => 12
           1 => [3, 6] => 3
           0 => [6, 7] =>

         */

        val rdd : RDD[String] = sc.textFile("data/word.txt", 2)

        rdd.saveAsTextFile("output")

        sc.stop()
    }
}
